#include "Controleur.h"

using namespace std;

Controleur::Controleur()
{
	
}

Controleur::Controleur(Vue* vue, Modele* modele)
{
	m_vue = vue;
	m_modele = modele;
}

void Controleur::deplacer(int x, int y)
{
	int tx = m_modele->getPersonnageX();
	int ty = m_modele->getPersonnageY();
	Case* acces = m_modele->getMap()[ty+y][tx+x];
	//les ifs ne vont pas, on affiche pas les actions pour les escaliers par exemple
	if(!acces->getBloquant())
	{
		m_modele->setPersonnagePosition(x,y);
		m_modele->putPersonnageOnMap();
	}
	else
	{
		cout<<"Vous ne pouvez vous deplacer ici"<<endl;
		m_derniereCoordonnees.first = ty+y;
		m_derniereCoordonnees.second = tx+x;
		ajouterAAjouter(acces);
	}
}

void Controleur::ajouterAAjouter(Case* acces)
{
	bool listeOk;
	string action = acces->getActionPossible();
	//vector d'action dans le cas ou plusieur actions speciales
	vector<string> actions;
	
	
	//EMPECHER LES DOUBLONS ICI
	
	for(int i = 0 ; i < action.length() ; i++)
	{
		if(action[i] == ' ')
		{
			actions.push_back(action.substr(0,i));
			action = action.erase(0,i+1); //supprime le mot précédent + l'espace
			i = 0; // comme on diminue la taille de l'action, on recommence à compter à 0
		}
	}
	//on rajoute le dernier element
	actions.push_back(action);
	
	//on verifie par rapport au menu affiché que l'élément n'est pas present en double,
	 //~ ne fonctionne pas qvec 1 ok et 1 faux il faut creer une tableau de liste ok
	for(int j = 0 ; j < actions.size() ; j++)
	{
		for(int i = 0 ; i < m_ajouter.size() ; i++)
		{
			if(actions[j] == m_ajouter[i])
				listeOk = false;
		}
	}
	for(int j = 0 ; j < actions.size() ; j++)
	{
		if(actions[j] != "" && listeOk)
			m_ajouter.push_back(actions[j]);
	}
}

void Controleur::effacerAjouter()
{
	m_ajouter.clear();
}

void Controleur::faireAction()
{
	cout<<"BUG"<<endl;
}

//permet de securiser le menu contre des actions non disponibles
bool Controleur::actionDisponible(int action)
{
	vector<string> menuTmp;
	int i = 0, cpt = 0;
	bool ok = true;
	int j = 0;
	
	//stocke les elements affichés
	for(i = 0 ; i < m_modele->getSizeMenu() ; i++)
	{
		menuTmp.push_back(m_modele->getElemMenu(i));
	}
	//Permet de ne garder que les numeros affichers de l'action
	while(j < menuTmp.size())
	{
		i=0;
		while(i<menuTmp[j].length() && ok)
		{
			if(menuTmp[j][i]=='.')
			{
				menuTmp[j] = menuTmp[j].substr(0,cpt);
				cpt = 0;
				ok = false;
			}
			else
				cpt++;
			i++;
		}
		j++;
		ok = true;
	}
	//convertit int to string
	string verification;
	stringstream out;
	out << action;
	verification = out.str();
	
	bool correspond = false;
	for(int i = 0 ; i < menuTmp.size() ; i++)
	{
		if(verification == menuTmp[i])
			correspond = true;
	}
	return correspond;
}
